//package com.dc.aspect;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.dc.DataSourceContext;
//import com.dc.MultiRouteDataSource;
//import com.dc.annotation.IgnoreDynamicData;
//import com.dc.common.ResponseResultVO;
//import com.dc.constat.SystemConstant;
//import com.dc.util.RedisUtil;
//import com.dc.util.TokenUtil;
//import com.dc.vo.SysUserVO;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.lang.annotation.Annotation;
//import java.util.Map;
//
//@Component
//@Aspect
//@Order(-1)
//@Slf4j
//public class BaseDynamicDataSourceAspect {
//
//    @Resource
//    TokenUtil tokenUtil;
//
//    @Resource
//    RedisUtil redisUtil;
//
//    @Resource
//    MultiRouteDataSource routeDataSource;
//
//    /**
//     * 普通Controller切面(interfaces)
//     */
//    @Pointcut("execution(public * com.dc.controller.*.*(..))")
//    public void addInterfaces() {
//    }
//
//    /**
//     * 普通Controller切面(cas、message、moitor、ngalain、oss、quartz、system)
//     */
////    @Pointcut("execution(public * com.dc.controller.*.*(..))")
////    public void addCas() {
////    }
//    @Around("addInterfaces()")
//    public Object Interceptor(ProceedingJoinPoint pjp) {
//        Object result = null;
//        MethodSignature signature = (MethodSignature) pjp.getSignature();
//        Annotation anoIgnore = signature.getMethod().getAnnotation(IgnoreDynamicData.class);
//        try {
//            //如果是bpm操作业务数据 获取方法中的数据源参数作为拦截目标
//            if (anoIgnore != null) {
//                try {
//                    result = pjp.proceed();
//                } catch (Throwable throwable) {
//                    throwable.printStackTrace();
//                    log.error("异常1");
//                }
//            } else {
//                //获取当前用户
//                String token = tokenUtil.getToken();
//                if (StringUtils.isBlank(token)) {
//                    return ResponseResultVO.failNoLoginResult("token失效");
//                }
//                String tokenRedisKey = "token:" + token;
//                Map<Object, Object> map = this.redisUtil.hmget(tokenRedisKey);
//                // Redis中会话的用户信息对象
//                Object userInfo = map.get(SystemConstant.REDIS_USER_INFO_KEY);
//                if (userInfo == null) {
//                    return ResponseResultVO.failNoLoginResult("token失效");
//                }
//                SysUserVO sysUser = new SysUserVO();
//                if (userInfo instanceof SysUserVO) {
//                    // 后台管理员用户
//                    sysUser = (SysUserVO) userInfo;
//                }
//                log.info("当前用户：" + sysUser);
//                //获取用户所对应的数据源
//                if (sysUser == null) {
//                    log.error("获取动态数据源为空,使用默认数据源：master");
//                } else {
//                    if (sysUser.getTenantId() == null || sysUser.getTenantId().equals("")) {
//                        log.error("获取动态数据源为空,使用默认数据源：master");
//                    } else {
//                        if (!MultiRouteDataSource.dataSourceIds.contains(sysUser.getTenantId()) && redisUtil.hasKey("dataSource:" + sysUser.getTenantId())) {
//                            Object dataSource = redisUtil.get("dataSource:" + sysUser.getTenantId());
//                            Map<String, Object> dataSources = JSONObject.parseObject(JSON.toJSONString(dataSource));
//                            String tenantId = String.valueOf(dataSources.get("id"));
//                            dataSources.remove("id");
//                            routeDataSource.addTargetDataSources(tenantId, dataSources);
//                            DataSourceContext.setDataSource(tenantId);
//                        } else {
//                            DataSourceContext.setDataSource(sysUser.getTenantId());
//                            log.info("当前数据源ID：" + sysUser.getTenantId());
//                        }
//                    }
//                }
//                try {
//                    result = pjp.proceed();
//                } catch (Throwable throwable) {
//                    throwable.printStackTrace();
//                    log.error("异常2");
//                }
//            }
//        } catch (Throwable throwable) {
//            log.error("获取动态数据源错误,还是原来的数据源" + throwable.getMessage());
//            return result;
//        } finally {
//            DataSourceContext.clearDataSource();
//        }
//        return result;
//    }
//
//
//}
